//
// Created by A on 2024/7/2.
//
#include "crash.h"

Crasg_str My_Crasg;
uint8_t Crash_group[9]={0,1,2,4,8,16,32,64,128};


uint8_t ceshi[128][64]={0};
/**
 * @brief 打印碰撞地图 内部测试使用
 */
static void printf_Crash(int x,int y,int w,int h){
    printf("printf_Crash\n");
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            printf("%d ",My_Crasg.CrashMap[x+j][y+i].Crash_pixel);
         //   printf("%d ",ceshi[x+j][y+i]);
        }
        printf("\n");
    }
}






/**
 * @brief 碰撞检测
 * @param Rect 检测矩形
 * @param Crash_group_level 碰撞组
 * @return 0 无冲突  非零有冲突 bit位为冲突层
 */
int Crash_check(Spirit_Rect Rect,int Crash_group_level){
    int ret=0;
    if(Crash_Contain(Rect)==0)
    {//如果在加载框内
        for (int i = 0; i <Rect.h ; i++) {
            for (int j = 0; j <Rect.w ; j++) {

                ret |= My_Crasg.CrashMap[Rect.x+j+Map_Offset][Rect.y+i+Map_Offset].Crash_pixel^Crash_group[Crash_group_level];
                if(ret) return ret;
//                printf("%d %d %d\n",Rect.x+j,Rect.y+i,1);
//                ceshi[Rect.x+j][Rect.y+i]|=Crash_group[Crash_group_level];
            }

        }
    }

    return ret;
}

/**
 *@brief 初始化碰撞
 *
 *
 * */

int Crash_init(void){
    //全部初始化为零
    for (int i = 0; i < HEIGHT+Map_Offset*2; i++) {
        for (int j = 0; j < WIDTH+Map_Offset*2;j ++) {
            My_Crasg.CrashMap[j][i].Crash_pixel=Crash_group[0];
        }
    }



    return 0;
}
/**
 *@brief 碰撞加载
 * 加载并不会检测碰撞冲突 而是会把所有的层都标记上
 *@param Rect 要在地图中加载的矩形
 *@param Crash_group 碰撞组
 *
 * */

int Crash_load(Spirit_Rect Rect,int Crash_group_level){
    printf("%d %d %d %d %d %d\n",Rect.x,Rect.y,My_Crasg.x- Map_Offset,My_Crasg.x +WIDTH+ Map_Offset,
           My_Crasg.y- Map_Offset,My_Crasg.y+HEIGHT+ Map_Offset);

    if(Crash_Contain(Rect)==0)
    {//如果在加载框内
        for (int i = 0; i <Rect.h ; i++) {
            for (int j = 0; j <Rect.w ; j++) {
                My_Crasg.CrashMap[Rect.x+j+Map_Offset][Rect.y+i+Map_Offset].Crash_pixel|=Crash_group[Crash_group_level];
//                printf("%d %d %d\n",Rect.x+j,Rect.y+i,1);
//                ceshi[Rect.x+j][Rect.y+i]|=Crash_group[Crash_group_level];
            }

        }
    }
    //CrashMap[Rect.x-Map_Offset][Rect.y-Map_Offset]
   // printf_Crash(Map_Offset,Map_Offset,128,64);
    return 0;
}


/**
 *@brief 监测所选区域是否在加载框内
 *@param Rect 要在地图中加载的矩形
 * */
int Crash_Contain(Spirit_Rect Rect){
    if((Rect.x>=(int)(My_Crasg.x- Map_Offset))
       &&(Rect.x<=(int)(My_Crasg.x +WIDTH+ Map_Offset))
       &&(Rect.y>=(int)(My_Crasg.y- Map_Offset))
       &&(Rect.y<=(int)(My_Crasg.y+HEIGHT+ Map_Offset))) {
        return 0;
    }
    return -1;
}